home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / ab20_archive / datacomm / vltjr-5.045.lzh / rexx / VLT2Provec.pvrx < prev    next >
Text File  |  1991-02-04  |  9KB  |  359 lines

  1. /** VLT2Provec.pvrx
  2. *
  3. *   This routine takes a VLT command file containing "Tek...." commands
  4. *   and translates them to instructions for Provector. This routine
  5. *   must be called from Provector using "Rexxecute", or you may add it
  6. *   as a menu option.
  7. *
  8. *   The VLT command file is prepared by selecting the VLT option
  9. *   "Save as Script Commands" option from the Image menu of the the
  10. *   VLT graphics screen.
  11. *
  12. *   When you run this routine from Provector, it will ask you for a file
  13. *   name. It will then start translating the commands and occasionally it
  14. *   will update the screen. Depending on the complexity of the plot, this
  15. *   may take some time.
  16. *
  17. *   Currently, not every VLT command is handled completely/correctly.
  18. *   Some commands are not implemented. If you find you need to make some
  19. *   enhancements, go right ahead!
  20. *
  21. *       Willy Langeveld, 4 February 1991.
  22. *
  23. **/
  24.    OPTIONS results
  25.    address 'ProVector'
  26. /*
  27. *   Get the file name and open it
  28. */
  29.    'GetStr "VLT command file to import:" "OK" "Abort"'
  30.    file = result
  31.    if ~open("INFILE",file) then do
  32.       'GetBool "Couldn''t open file" "OK" "Eyup"'
  33.       exit 0
  34.    end
  35. /*
  36. *   Set page dimensions
  37. */
  38.    pdims.x1 = 0
  39.    pdims.y2 = 0
  40.    pdims.x2 = 8.5
  41.    pdims.y1 = 8.5
  42.  
  43.    'SetPageSize' pdims
  44. /*
  45. *   Scale factors.
  46. */
  47.    xscale = 8.5/4096
  48.    yscale = 8.5/4096
  49. /*
  50. *   Make a background object
  51. */
  52.    pts.0.x = 0
  53.    pts.0.y = 0
  54.    pts.1.x = 0
  55.    pts.1.y = 8.5
  56.    pts.2.x = 8.5
  57.    pts.2.y = 8.5
  58.    pts.3.x = 8.5
  59.    pts.3.y = 0
  60.    'Polygon' 4 pts
  61.  
  62.    BackGround = result
  63.  
  64.    'ChangeFillVal '  BackGround 0
  65.    'ChangeEdgeType ' BackGround 0
  66. /*
  67. *   Initialize some variables
  68. *   Picture. contains the attributes that we can't set immediately.
  69. */
  70.    Picture. = ""
  71.    Picture.Linepen = 1
  72.    Picture.Textpen = 1
  73. /*
  74. *   npts is the number of points in the pts. array.
  75. */
  76.    npts = 0
  77. /*
  78. *   LineMode = 1 means we're drawing a line object
  79. *   LineMode = 2 means we're drawing a filled object
  80. */
  81.    LineMode = 1
  82. /*
  83. *   Some marker types. This really needs to be improved, but then,
  84. *   who uses markers anyway...
  85. */
  86.    MarkerTypes.0  = "."
  87.    MarkerTypes.1  = "."
  88.    MarkerTypes.2  = "+"
  89.    MarkerTypes.3  = "*"
  90.    MarkerTypes.4  = "O"
  91.    MarkerTypes.5  = "X"
  92.    MarkerTypes.6  = "O"
  93.    MarkerTypes.7  = "O"
  94.    MarkerTypes.8  = "X"
  95.    MarkerTypes.9  = "X"
  96.    MarkerTypes.10 = "X"
  97. /*
  98. *   Set the upper 128 colors to Tektronix colors
  99. */
  100.    do i = 1 to 5
  101.       do j = 1 to 5
  102.          do k = 1 to 5
  103.             rgb.r = i * 51
  104.             rgb.g = j * 51
  105.             rgb.b = k * 51
  106.             pen = (i-1) * 25 + (j-1) * 5 + k + 127
  107.             'SetColor ' pen rgb
  108.          end
  109.       end
  110.    end
  111. /*
  112. *   Reset the timer
  113. */
  114.    call time('r')
  115. /*
  116. *   Main loop over VLT's commands
  117. */
  118.    do i = 1 while ~eof("INFILE")
  119.       data = readln("INFILE")
  120.  
  121.       parse var data 'Tek' cmd xx yy zz .
  122.       cmd = upper(cmd)
  123. /*
  124. *   Every 5 seconds, fix the display
  125. */
  126.       if time('e') > 5 then do
  127.          'Repair'
  128.          call time('r')
  129.       end
  130. /*
  131. *   We should finish up the current object if the command is not MOVE,
  132. *   DRAW or POLYGON. These do their own cleanups
  133. */
  134.       if (cmd ~= "MOVE") & (cmd ~= "DRAW") & (cmd ~= "POLYGON") then do
  135.          if npts ~= 0 then do
  136.             if      LineMode = 1 then call DoPolyLine
  137.             else if LineMode = 2 then call DoPolygon
  138.             npts = 0
  139.          end
  140.       end
  141. /*
  142. *   Now handle the commands. Some of them are quite weird...
  143. *   There are some we don't handle (they do a "nop").
  144. */
  145.       select
  146.          when cmd = "MOVE" then do
  147.             if LineMode = 1 then do
  148.                if npts ~= 0 then call DoPolyLine
  149.                pts.0.x = xx * xscale
  150.                pts.0.y = yy * yscale
  151.                npts = 1
  152.             end
  153.             else if LineMode = 2 then do
  154.                pts.npts.x = xx * xscale
  155.                pts.npts.y = yy * yscale
  156.                npts = npts + 1
  157.             end
  158.          end
  159.          when cmd = "DRAW" then do
  160.             pts.npts.x = xx * xscale
  161.             pts.npts.y = yy * yscale
  162.             npts = npts + 1
  163.          end
  164.          when cmd = "MARKER" then do
  165.             zz = Picture.MarkerType
  166.             call DoChar(1)
  167.          end
  168.          when cmd = "CHARACTER" then do
  169.             call DoChar(0)
  170.          end
  171.          when cmd = "ERASE" then do
  172.             nop
  173.          end
  174. /*
  175. *   OLDMODE is no longer used by VLT, though it is still supported for
  176. *   old pictures. Note that there is some overlap between OLDMODE,
  177. *   MODE, PATTERN, and MODEPATTERN
  178. */
  179.          when cmd = "OLDMODE" then do
  180.             Picture.Linepen = xx
  181.             Picture.Textpen = xx
  182.          end
  183.          when cmd = "MODE" then do
  184.             if      yy = 0 then Picture.Linepen = xx
  185.             else if yy = 1 then Picture.Textpen = xx
  186.             else if yy = 2 then do
  187.                Picture.Fillpen  = xx // 256
  188.                Picture.Filltype = 1
  189.  
  190.                if xx > 255 then do
  191.                   if      bittst(d2c(xx), 8)  then Picture.Filltype = 2
  192.                   else if bittst(d2c(xx), 9)  then do
  193.                      Picture.Filltype = 1
  194.                      Picture.Fillpen  = Picture.Fillpen + 128
  195.                   end
  196.                   else if bittst(d2c(xx), 10) then Picture.FillType = 0
  197.                end
  198.             end
  199.             else if yy = 3 then Picture.AluMode = xx
  200.          end
  201.          when cmd = "PATTERN" then do
  202.             Picture.Pattern = xx
  203.          end
  204.          when cmd = "MODEPATTERN" then do
  205.             Picture.Linepen = xx
  206.             Picture.Pattern = yy
  207.          end
  208.          when cmd = "INIT" then do
  209.             nop
  210.          end
  211. /*
  212. *   Here we decode the color values. Note that red and green are in the
  213. *   upper and lower nybbles of the yy value.
  214. */
  215.          when cmd = "COLOR" then do
  216.             rgb.r = yy / 16 % 1 * 17
  217.             rgb.g = yy // 16 * 17
  218.             rgb.b = zz * 17
  219.             'SetColor 'xx rgb
  220.          end
  221. /*
  222. *   Like some other commands, POLYGON comes in two flavors distinguished
  223. *   by one of the args, here it's xx. Not correctly handled here is the
  224. *   case where there are "polygons within polygons".
  225. */
  226.          when cmd = "POLYGON" then do
  227.             if xx = 1 then do
  228.                if LineMode = 1 then do
  229.                   if npts ~= 0 then call DoPolyLine
  230.                   npts = 0
  231.                end
  232.                LineMode = 2
  233.                Picture.PolyOutline = yy
  234.             end
  235.             else if xx = 0 then do
  236.                if npts ~= 0 then call DoPolygon
  237.                npts = 0
  238.                LineMode = 1
  239.             end
  240.          end
  241.          when cmd = "TEXTJAM" then do
  242.             Picture.TextJAM = xx
  243.          end
  244.          when cmd = "TEXTSIZE" then do
  245.             Picture.TextSize.x     = xx
  246.             Picture.TextSize.y     = yy
  247.             Picture.TextSize.Space = zz
  248.          end
  249.          when cmd = "MARKERTYPE" then do
  250.             Picture.MarkerType = MarkerTypes.xx
  251.          end
  252.          when cmd = "TEXTPATHANGLE" then do
  253.             if      yy = 0 then Picture.TextAngle = xx
  254.             else if yy = 1 then Picture.TextPath  = xx
  255.          end
  256.          when cmd = "BACKGROUNDCOLOR" then do
  257.             'ChangeFillVal ' BackGround xx
  258.          end
  259.          when cmd = "SETWINDOW" then do
  260.             if zz = 1 then do
  261.                Picture.Corner.1.x = xx
  262.                Picture.Corner.1.y = yy
  263.                xscale = 8.5/(Picture.Corner.1.x - Picture.Corner.0.x + 1)
  264.                yscale = xscale
  265.             end
  266.             else if zz = 0 then do
  267.                Picture.Corner.0.x = xx
  268.                Picture.Corner.0.y = yy
  269.             end
  270.          end
  271.          when cmd = "GRAPHCHAR" then do
  272.             call DoChar(1)
  273.          end
  274. /*
  275. *   We don't handle PIXEL operations yet.
  276. */
  277.          when cmd = "PIXELRECT"  then do
  278.             nop
  279.          end
  280.          when cmd = "PIXELCOPY"  then do
  281.             nop
  282.          end
  283.          when cmd = "PIXELWRITE" then do
  284.             nop
  285.          end
  286.          otherwise do
  287.             nop
  288.          end
  289.       end
  290.    end
  291.  
  292. /*
  293. *   We reached the end of file. Have to finish current object
  294. */
  295.    if npts ~= 0 then do
  296.       if      LineMode = 1 then call DoPolyLine
  297.       else if LineMode = 2 then call DoPolygon
  298.    end
  299. /*
  300. *   Final repair
  301. */
  302.    'Repair'
  303.    address command 'say "I am Finished"'
  304.    call delay(50)
  305.    address command 'say "I said, I am Done"'
  306.    exit
  307.  
  308.  
  309. /**
  310. *
  311. *   Finish up a line object
  312. *
  313. **/
  314. DoPolyLine:
  315.    'PolyLine' npts pts
  316.    object = result
  317.    'ChangeEdgeVal ' object Picture.Linepen
  318.    return
  319.  
  320. /**
  321. *
  322. *   Finish up a polygon object
  323. *
  324. **/
  325. DoPolygon:
  326.    'Polygon' npts pts
  327.    object = result
  328.    'ChangeFillType ' object Picture.Filltype
  329.    'ChangeFillVal '  object Picture.Fillpen
  330.    'ChangeEdgeType ' object Picture.PolyOutline
  331.    return
  332.  
  333. /**
  334. *
  335. *   Display a character
  336. *
  337. **/
  338. DoChar:
  339.    arg graph
  340.  
  341.    width  = Picture.TextSize.x * xscale
  342.    height = Picture.TextSize.y * yscale
  343.  
  344.    if graph = 1 then angle = Picture.TextAngle
  345.    else              angle = 0
  346.  
  347.    'Text ' '"'d2c(zz)'"' xx*xscale yy*yscale width height angle
  348.    textobj = result
  349. /*
  350. *  Change the string to the desired font
  351. *  Reflect to handle change in default coordinate system
  352. *  Then replot the changes
  353. *  Here we hit a provector bug if the pagesize is too big
  354. */
  355.    'ChangeFont ' textobj ' simple_stroke'
  356.    'Size ' textobj xx*xscale yy*yscale ' 1 -1'
  357.    'ChangeEdgeVal ' textobj Picture.Textpen
  358.    return
  359.